import axios from 'axios';
import { message } from 'ant-design-vue';
import store from '@/store';
import router from '@/router';
import {getCache,removeCache} from '@/utils/session'
let baseURL = process.env.NODE_ENV == "development" ? '/api' : 'http://110.40.128.240:28888/api'
const service = axios.create({
    baseURL,
    timeout: 30000 // 请求超时时间
});
//请求
service.interceptors.request.use(config => {
    let token = getCache('TOKEN') || '';
    config.headers['token'] = token;
    // config.headers['tenant'] = store.getters.tenant;
    let {url} = config;
    if(url.indexOf('tenant')==-1){
        config.params = config.params || {};
        config.params.companyCode = store.getters.tenant
    }
    return config;
});

//响应
service.interceptors.response.use(response => {
    let { code = 200 } = response.data;
    if (code == 200) {
        return Promise.resolve(response);
    }else {
        message.error(response.data.msg || response.msg || '操作错误');
        return Promise.reject(response);
    }
}, error => {
    if (error.response && error.response.status) {
        switch (error.response.status) {
            // 401: 未登录
            // 未登录则跳转登录页面，并携带当前页面的路径
            // 在登录成功后返回当前页面，这一步需要在登录页操作。                
            case 401:
                message.error('未授权')
                // 清除token
                removeCache('TOKEN');
                removeCache('tenantInfo');
                removeCache('permissions');
                removeCache('routers');
                store.commit('user/SET_TOKEN', '');
                let tenant = getCache('tenant') || 'master';
                // 跳转登录页面，并将要浏览的页面fullPath传过去，登录成功后跳转需要访问的页面 
                setTimeout(() => {
                    router.replace({
                        path: `/${tenant}/login`
                    });
                }, 1000);
                break;
            // 403 token过期
            // 登录过期对用户进行提示
            // 清除本地token和清空vuex中token对象
            // 跳转登录页面                
            case 403:
                message.error('禁止访问')
                router.go(-1)
                break;
            // 404请求不存在
            case 404:
                message.error('网络请求不存在');
                break;
            // 其他错误，直接抛出错误提示
            default:
                message.error(error.response.data.message || error.response.data.msg || '请求错误')
        }
        return Promise.reject(error.response.data);
    } else {
        message.error('请求错误，请重试')
        return Promise.reject(error.response);
    }
});

let http = {};

/**
 * get方法，对应get请求
 * @param {String} url [请求的url地址]
 * @param {Object} params [请求时携带的参数]
 */

http.get = function (url, params = null) {
    return new Promise((resolve, reject) => {
        service
            .get(url, { params })
            .then(res => {
                resolve(res.data);
            })
            .catch(e => {
                reject(e);
            });
    });
};

/**
 * post方法，对应post请求
 * @param {String} url [请求的url地址]
 * @param {Object} params [请求时携带的参数]
 */

http.post = function (url, data) {
    return new Promise((resolve, reject) => {
        service
            .post(url, data)
            .then(res => {
                resolve(res.data);
            })
            .catch(e => {
                reject(e);
            });
    });
};
/**
 * put方法，对应put请求
 * @param {String} url [请求的url地址]
 * @param {Object} params [请求时携带的参数]
 */

http.put = function (url, data) {
    return new Promise((resolve, reject) => {
        service
            .put(url, data)
            .then(res => {
                resolve(res.data);
            })
            .catch(e => {
                reject(e);
            });
    });
};

/**
 * delete方法，对应delete请求
 * @param {String} url [请求的url地址]
 * @param {Object} data [请求时携带的参数]
 */

http.delete = function (url, data) {
    return new Promise((resolve, reject) => {
        service
            .delete(url, { data })
            .then(res => {
                resolve(res.data);
            })
            .catch(e => {
                reject(e);
            });
    });
};

export default http;
